#include "sc8802.h"
#include "main.h"

//	PB9 GPIO INPUT, as a signal that indicate the battery is charge ok or not.
//	LOW: charging, HIGH:charge ok.
#define READ_CHARGE_PORT() LL_GPIO_IsInputPinSet(GPIOB, LL_GPIO_PIN_9)

//	PC14 GPIO OUTPUT, enable SC8802 or not
//	LOW: enable, HIGH: disable
#define WRITE_SC8802_ENABLE_PORT() LL_GPIO_ResetOutputPin(GPIOC, LL_GPIO_PIN_14)
#define WRITE_SC8802_DISABLE_PORT() LL_GPIO_SetOutputPin(GPIOC, LL_GPIO_PIN_14)

// Tim16 channel1  pwm control
void sc8802Init(void)
{
    sc8802Ctl(FALSE);
    // MPTT Control Logic: Pull Down to enable mptt
    // 5V MPTT GPIO B4
    // 9V MPTT GPIO B5
    // 12V MPTT GPIO B6
    // init to disable mptt
    LL_GPIO_ResetOutputPin(GPIOB, LL_GPIO_PIN_4);
    LL_GPIO_ResetOutputPin(GPIOB, LL_GPIO_PIN_5);
    LL_GPIO_ResetOutputPin(GPIOB, LL_GPIO_PIN_6);
}

void sc8802Ctl(BOOL enable)
{
    if (enable)
    {
        // HAL_TIM_PWM_Start(&htim16, TIM_CHANNEL_1); // 启用pwm
        LL_TIM_EnableCounter(TIM16);
        LL_TIM_CC_EnableChannel(TIM16, LL_TIM_CHANNEL_CH1);
        WRITE_SC8802_ENABLE_PORT();
    }
    else
    {
        // HAL_TIM_PWM_Stop(&htim16, TIM_CHANNEL_1); // 启用pwm
        LL_TIM_DisableCounter(TIM16);
        LL_TIM_CC_DisableChannel(TIM16, LL_TIM_CHANNEL_CH1);
        WRITE_SC8802_DISABLE_PORT();
    }
}
void sc8802SetCurrent(float current)
{
    uint16_t pwm = 0;
    float pwmF = 0.0;
    if (current >= MAX_CURRENT)
    {
        current = MAX_CURRENT;
    }

    if (current < 0.0)
    {
        current = 0.0;
    }
    pwmF = current / MAX_CURRENT;
    pwm = (uint16_t)(pwmF * 100 + 0.5);
    LL_TIM_OC_SetCompareCH1(TIM16, pwm);
    //__HAL_TIM_SET_COMPARE(&htim16, TIM_CHANNEL_1, pwm); // 开启pwm 为0%
}
BOOL sc8802IsChargeOk(void)
{
    if (READ_CHARGE_PORT())
    {
        return FALSE;
    }
    else
    {
        return TRUE;
    }
}
void sc8802SetMPTTVoltage(MTTP_TRACKER voltage)
{
    switch (voltage)
    {
    case MTTP_5V:
        LL_GPIO_SetOutputPin(GPIOB, LL_GPIO_PIN_4);
        LL_GPIO_ResetOutputPin(GPIOB, LL_GPIO_PIN_5);
        LL_GPIO_ResetOutputPin(GPIOB, LL_GPIO_PIN_6);
        break;
    case MTTP_9V:
        LL_GPIO_ResetOutputPin(GPIOB, LL_GPIO_PIN_4);
        LL_GPIO_SetOutputPin(GPIOB, LL_GPIO_PIN_5);
        LL_GPIO_ResetOutputPin(GPIOB, LL_GPIO_PIN_6);
        break;
    case MTTP_12V:
        LL_GPIO_ResetOutputPin(GPIOB, LL_GPIO_PIN_4);
        LL_GPIO_ResetOutputPin(GPIOB, LL_GPIO_PIN_5);
        LL_GPIO_SetOutputPin(GPIOB, LL_GPIO_PIN_6);
        break;
    case MTTP_DISABLE:
        LL_GPIO_ResetOutputPin(GPIOB, LL_GPIO_PIN_4);
        LL_GPIO_ResetOutputPin(GPIOB, LL_GPIO_PIN_5);
        LL_GPIO_ResetOutputPin(GPIOB, LL_GPIO_PIN_6);
    default:
        break;
    }
}
